opencv

您所在的位置:网站首页 mac 编译opencv opencv

opencv

2024-07-07 19:49| 来源: 网络整理| 查看: 265

相关链接: opencv-3.4.1-x86编译安装 – 超详细

opencv-3.4.1-arm编译安装 环境1.安装依赖库2.OpenCV源码获取并解压2.1 获取源码2.2 工作目录准备 3.交叉编译OpenCV3.1 cmake-gui生成makefile3.2 make&&make install 及可能遇到的问题3.2.1 **`问题1`**3.2.2 **`问题2`** 4.交叉编译OpenCV_contrib4.1 修改cmake-gui 生成Makefile4.2 编译安装make && make install4.2.1 `问题3`:4.2.2 `问题4`: 5.测试--QT使用cv开启摄像头5.1 创建qt工程5.2 准备工作5.3 编写代码 && build5.4 ubuntu与开发板准备5.4.1 摄像头接入开发板,测试5.4.2 配置ip -- 开发板-ubuntu互连5.4.3 搭建nfs服务器,开发板访问工作目录5.4.4 添加cv动态库路径 5.5 开发板运行qt程序5.6 开发板运行测试程序可能遇到的问题5.6.1 `问题5`:5.6.2 `问题6`: 6 测试无误后,则将交叉编译后的opencv的lib库复制到开发板的/usr/lib中(只要是开发板运行程序能链接到动态库的目录就行)

环境 ubuntu:ubuntu1604 arm-linux-gcc:arm-cortex_a9-linux-gnueabi (version 4.7.4) arm开发板:S5P6818 opencv源码:opencv-3.4.1 opencv_contrib扩展包:opencv_contrib-3.4.1 makefile生成:cmake+cmake-gui 1.安装依赖库 #apt-get install lib32z1 #apt-get install cmake cmake-qt-gui build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libtiff5-dev libswscale-dev libjasper-dev 2.OpenCV源码获取并解压 2.1 获取源码

官网处获取源码:速度比较慢,没梯可能不好办。 https://github.com/opencv 在这里插入图片描述 选择对应版本,下载下来 也可以下载我下载好的,5积分(放的时候是5): https://download.csdn.net/download/qq_44503344/12666252

2.2 工作目录准备 #mkdir /opt/wkspace/opencv_arm #cd /opt/wkspace/opencv_arm #cp ?/opencv-3.4.1.zip #cp ?/opencv_contrib-3.4.1.zip . #unzip opencv-3.4.1.zip #unzip opencv_contrib-3.4.1.zip 3.交叉编译OpenCV

交叉编译时,要先编译源码包再编译扩展包

3.1 cmake-gui生成makefile #cd opencv-3.4.1 #mkdir build #cd build #cmake-gui ..

在这里插入图片描述 **1)点击configure ** 在这里插入图片描述 2)配置编译器 关键,搞错随随便便重新经历make 根据博文:https://blog.csdn.net/u013752202/article/details/47358389/的解释:Operating System只能写Linux,经过测试写arm-linux(实际上只是第一次以为没问题emmm)的话编译出来的库不完整,无法运行。 在这里插入图片描述 3)勾选 jpeg和png库 在这里插入图片描述 4)修改安装目录 记得要改哈。。免得安装到usr/local里跟x86版本搞混了

我安装在 /opt/wkspace/opencv_arm/output 在这里插入图片描述 5)configure && Generate生成makefile 在这里插入图片描述

3.2 make&&make install 及可能遇到的问题

make时长可能有点久,我机器大概花了7个小时。

3.2.1 问题1

/opt/wkspace/opencv_arm/opencv-3.4.1/3rdparty/protobuf/src/google/protobuf/stubs/common.cc:52:2: error: #error "No suitable threading library available." 原因:没有连接到pthread库 解决方法: 1)修改common.cc文件 在文件最上方加入语句

#define HAVE_PTHREAD

在这里插入图片描述 2)修改CMakeCache.txt 修改(可以在vim中用’/'来定位字串):

//Flags used by the linker. CMAKE_EXE_LINKER_FLAGS:STRING=

为:

//Flags used by the linker. CMAKE_EXE_LINKER_FLAGS:STRING= -lpthread -lrt

重新make解决

3.2.2 问题2 ../../lib/libopencv_core.so: undefined reference to `dlopen' ../../lib/libopencv_core.so: undefined reference to `dlclose' ../../lib/libopencv_core.so: undefined reference to `dlsym' collect2: error: ld returned 1 exit status modules/core/CMakeFiles/opencv_test_core.dir/build.make:880: recipe for target 'bin/opencv_test_core' failed

原因:dl库未链接 解决方法:修改CMakeCache.txt 修改(可以在vim中用’/'来定位字串):

//Flags used by the linker. CMAKE_EXE_LINKER_FLAGS:STRING= -lpthread -lrt -ldl

重新make解决

4.交叉编译OpenCV_contrib 4.1 修改cmake-gui 生成Makefile #cd opencv-3.4.1 #mkdir build #cd build #cmake-gui ..

加入modules路径 在这里插入图片描述 勾选C++11特性 — ENABLE_CXX11(可选,注意看configure是否由于C11报错error,有的话取消该选项,对基本使用不影响) 在这里插入图片描述 Configure && Generate , 生成Makefile

4.2 编译安装make && make install 4.2.1 问题3:

/opt/wkspace/opencv/opencv_contrib-3.4.1/modules/xfeatures2d/src/vgg.cpp:490:41 fatal error: vgg_generated_120.i: No such file or directory 还有很多类似的xxx.i,都是同个问题 原因:同样是无法连接到该网络,下载这个包 解决方法:https://blog.csdn.net/jiaken2660/article/details/104132060 下载文件后缀该为.tar.gz解压后为: 在这里插入图片描述 移动到 在这里插入图片描述 重新make解决

4.2.2 问题4:

/opt/wkspace/opencv/opencv-3.4.1/modules/stitching/include/opencv2/stitching/detail/matchers.hpp:52:42: fatal error: opencv2/xfeatures2d/cuda.hpp: No such file or directory 同样也有一些类似的找不到头文件问题,都同个解决方法 原因:扩展包的include没在gcc编译这个文件时的头文件路径上 解决方法:将对应文件的include处更改为绝对路径在这里插入图片描述 改为: 在这里插入图片描述

安装扩展包后:/opt/wkspace/opencv_arm/ouput/lib (可能可以简化安装包之类,不过这个总大小也就32M,应该影响不大) 在这里插入图片描述

5.测试–QT使用cv开启摄像头

参考:【OpenCV+Qt】在Qt界面中显示OpenCV处理的图像

5.1 创建qt工程

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

5.2 准备工作

1)pro文件中添加头文件与路径,如下:

INCLUDEPATH += $(opencv目录)/include LIBS +=$(opencv目录/lib)/libopencv*

如图: 在这里插入图片描述 2)在cameratest.cpp中加入头文件opencv2/opencvhpp: 在这里插入图片描述 3)创建一个大小合适的label: 在这里插入图片描述 4)添加一个pushbutton,并右键进入点击槽函数: 在这里插入图片描述

5.3 编写代码 && build Cameratest.h #ifndef CAMERATEST_H #define CAMERATEST_H #include #include #include #include using namespace cv; namespace Ui { class CameraTest; } class CameraTest : public QWidget { Q_OBJECT public: explicit CameraTest(QWidget *parent = 0); ~CameraTest(); private slots: void on_pushButton_clicked(); private: Ui::CameraTest *ui; QTimer * mytimer; // 定时获取摄像头图像 VideoCapture cap; // opencv用于打开摄像头的控件 Mat frame; // 从cap中获取一帧图像 是oepncv的BRG格式,输出到label还需转换 private slots: void cameraOpen(); }; #endif // CAMERATEST_H Cameratest.cpp #include "cameratest.h" #include "ui_cameratest.h" using namespace cv; CameraTest::CameraTest(QWidget *parent) : QWidget(parent), ui(new Ui::CameraTest) { ui->setupUi(this); mytimer = new QTimer(this); connect(mytimer, SIGNAL(timeout()), this, SLOT(cameraOpen())); cap.open(0); // 打开摄像头 /dev/video0 } CameraTest::~CameraTest() { delete ui; } void CameraTest::cameraOpen() { // 定时获取摄像头数据并显示 mytimer->stop(); cap >> frame; // 从摄像头获取一帧数据 Mat image; // 定义一个Mat存储转换后的RGB格式图像 /* opencv 默认BGR存放;而Image需要用RGB格式 */ cvtColor(frame, image, CV_BGR2RGB); QImage Qimage = QImage((const unsigned char *)(image.data), // 强转为普通字节流 image.cols, image.rows, image.step, QImage::Format_RGB888); ui->label->setPixmap(QPixmap::fromImage(Qimage)); ui->label->resize(Qimage.size()); ui->label->show(); // 显示到label mytimer->start(30); } /* 按键触发定时器 */ void CameraTest::on_pushButton_clicked() { mytimer->start(30); } 5.4 ubuntu与开发板准备 5.4.1 摄像头接入开发板,测试 #cat /dev/video0 有乱码输出 ---- 此摄像头设备节点为/dev/video0 5.4.2 配置ip – 开发板-ubuntu互连

我用的是usb转网口,ip静态且固定: 在这里插入图片描述 1)配置开发板ip: 在这里插入图片描述 2)配置虚拟机ubuntu ip 增加虚拟机 虚拟网络 - - - 桥接到USB网络适配器 : 在这里插入图片描述 增加ubuntu虚拟网卡 – 使用刚刚创建的vmnet1 在这里插入图片描述 设置ubuntu的ip: 新建网络配置: 在这里插入图片描述 将新网卡连接到该网络: 在这里插入图片描述 查看ip: 在这里插入图片描述 3)互ping: 在这里插入图片描述

5.4.3 搭建nfs服务器,开发板访问工作目录 #vim /etc/exports

在这里插入图片描述 重启nfs服务器

#service nfs-server restart

开发板端:

#mount -o nolock 169.254.218.200:/opt /mnt 5.4.4 添加cv动态库路径

开发板端:

#cd /mnt/wkspace/opencv_arm/output/lib #export LD_LIBRARY_PATH=$PWD:$LD_LIBRARY_PATH 5.5 开发板运行qt程序 #cd /mnt/wkspace/Qt_opencv_test/build-Opencvtest-arm_linux-Debug #./Opencvtest

结果: 在这里插入图片描述

5.6 开发板运行测试程序可能遇到的问题 5.6.1 问题5:

./Opencvtest: error while loading shared libraries: /opt/wkspace/opencv_arm/output/lib/libopencv_aruco.so: cannot open shared object file: No such file or directory 原因:cmake-gui的时候,Operating System写arm-linux时,开发板运行测试程序时候报的错误,其实就是库不完整。

根据博文:https://blog.csdn.net/u013752202/article/details/47358389/的解释:在#cmake-gui的时候,Operating System只能写Linux,经过测试写arm-linux(实际上只是第一次以为没问题emmm)的话编译出来的库不完整,无法运行。 解决方法:仔细核对cmake-gui时是否操作有误,重新配置编译安装

5.6.2 问题6:

看到rebuild the lib 差点自闭了 原因:在使用QTimer定时之前,我用了waitKey来进行定时/延时,而开发板的lib库不支持waitKey函数(没有gtk) 解决方法:只是个小问题,改成qt自带的qtimer就行了

6 测试无误后,则将交叉编译后的opencv的lib库复制到开发板的/usr/lib中(只要是开发板运行程序能链接到动态库的目录就行)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3